| 简短说明 | |
|---|---|
|
文件: |
|
|
默认平台: |
|
|
简要说明 并行使用 JPEG_Encoder_Gray 算子以提升用于 JPEG 压缩的带宽。 |
|
本示例旨在展示如何克服 JPEG_Encoder_Gray 在 JPEG 压缩中的带宽限制。 为实现这一点,需并行使用多个算子。针对 marathon mE5 VCL 平台提供了两个示例。 JPEG_Gray 示例使用四个算子并行编码全配置灰度图像。 JPEG_Color 示例使用六个算子对来自拜耳相机的图像进行编码,并对色度分量进行水平和垂直方向的子采样。
此设计使用四个 JPEG_Encoder_Gray 算子来对带宽最高达 1200MP/s 的图像进行编码(这对于全配置的 CameraLink 相机而言已足够)。
JPEG 流基于游程编码。每个流均以一个 DC 部分开头,后跟多个 AC 分量。
因此,为了将图像分割到多个编码器,必须按时间间隔重新开始编码。
在 JPEG 格式中,这可以通过使用重新启动标记来完成。
因此,VisualApplets 设计将图像分割为八行为一组的块(最小编码单元 (MCU) 的一行)。
在每个 MCU 行的末尾插入一个重新启动标记。
在图 276 中可以看到常规的小程序。对于压缩而言,有三个有趣的层次化框(JPEGBlockSorter8x8、SplitImage 和 SYNC)。
在 JPEGBlockSorter8x8(图 277)中,八行的数据被重新排列为 8x8 像素的块。这些块会连续发送。
为了保持图像易于处理,尺寸保持不变。
SplitImage(图 279)将图像保存到 DRAM 中,并重新排列各行,使得四个连续的行对应四个独立的 MCU 块行。
通过这种方式,MCU 块行的流可以被分割并发送到 4 个独立的编码器。
SYNC 收集编码后的流,用重新启动标记替换末尾的信息标签,并将所有行追加到一个图像中。
首先,将八个像素追加到一个“块像素”中。在排序框中,这些“块像素”的排列方式使得每一行的块像素依次相连,如图 278 所示
SplitImage(图 279)框将来自 JPEGBlockSorter8x8(图 277)的行重新排列为一种方案,
在此方案中,每次会单独传输四个块。每个块由八行组成。此过程会重复进行,直到所有行都传输完毕。
在 Split 框中,图像被分割成四个图像。这是通过从不属于该图像的每个链路中移除所有行来完成的。
这些子图像被分割为
高度为八的图像,以便小程序能够在八行的末尾插入重新启动间隔。
SYNC 框将各个 JPEG_Converter 的流合并为一个图像。这通过三个步骤完成。首先,标记最终的字节(0xFFD9 - 图像结束标记 + 来自算子的信息)以便移除。 这在 RemoveFillByte 框(图 280)中完成。 其次,在块之间添加重新启动标记。JPEG 流中的重新启动标记结构为:“0xFFDx”, 其中 x 是从 0 到 7 循环计数的值。这在 RestartMarker 框(图 277)中完成。 第三,移除未使用的字节。
对于从此小程序中输出的图像数据,您需要将重新启动信息添加到标头中。这可以通过将 DRI 标记 (0xFF DD) 添加到标头中来完成。
此示例与灰度示例基本相同。不同之处在于:
1. 来自 Bayer 转换的 RGB 数据被转换为 YCrCb 色彩空间。
2. 对 Cr 和 Cb 分量进行子采样。
3. 分离的图像被缓存在单独的缓冲区中。为了将行排列到六个转换器而无需插入虚拟行,需要一个独立的排序缓冲区。
4. 需要将 Sync 拆分为三个高度不同的不同图像。
为了在子采样图像中使用重启间隔,需要将采样因子调整为通道中的最小 MCU 数量。我们使用 4:2:0 子采样。 这意味着 Cr 和 Cb 图像中的行宽只有一半。这就是为什么 Y 图像中的行也需要对半拆分,以便将所有重启标记放在同一位置的原因。

上一页

